package com.passion;

import cn.hippo4j.core.enable.EnableDynamicThreadPool;
import com.passion.context.SysContext;
import lombok.extern.slf4j.Slf4j;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import java.net.UnknownHostException;

/**
 * 类描述：
 *
 * @author ZhuYin
 * @since 2024年11月15日
 */
@Slf4j
@EnableDynamicThreadPool
@MapperScan({"com.passion.**.dao"})
@SpringBootApplication(scanBasePackages = {"com.passion.**"})
public class PassionApplication {

    public static void main(String[] args) throws UnknownHostException {
        // 环境变量设置
        setupEnvProperties();
        SpringApplication.run(PassionApplication.class, args);
        // 控制台打印系统信息(生产环境可以去掉)
        SysContext.logSysInfo();
    }

    private static void setupEnvProperties() {
        // 如果使用的是 OpenJdk 则需要设置
        System.setProperty("java.vm.name", "Java HotSpot(TM)");
        // 配置文件解密
        System.setProperty("jasypt.encryptor.password", "2EbU[q$pK7");

        // 获取系统的核心数
        int availableProcessors = Runtime.getRuntime().availableProcessors();

        // 计算 CPU 密集型任务的线程池参数
        int cpuCorePoolSize = availableProcessors + 1;
        int cpuMaxPoolSize = availableProcessors + 1;

        // 计算 I/O 密集型任务的线程池参数
        int ioCorePoolSize = availableProcessors * 2;
        int ioMaxPoolSize = availableProcessors * 2;

        // 设置环境变量
        System.setProperty("CORE_POOL_SIZE", String.valueOf(cpuCorePoolSize));
        System.setProperty("MAX_POOL_SIZE", String.valueOf(cpuMaxPoolSize));

        // 如果有多个线程池，可以根据需要设置不同的环境变量
        System.setProperty("IO_CORE_POOL_SIZE", String.valueOf(ioCorePoolSize));
        System.setProperty("IO_MAX_POOL_SIZE", String.valueOf(ioMaxPoolSize));
    }

}
